package com.api.controller;

import cn.dev33.satoken.secure.SaSecureUtil;
import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import com.api.entity.User;
import com.api.entity.UserDept;
import com.api.entity.UserRole;
import com.api.log.Log;
import com.api.mapper.UserMapper;
import com.api.mapper.UserRoleMapper;
import com.api.utils.ParamsUtils;
import com.api.utils.Result;
import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.query.QueryWrapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Date;
import java.util.List;
import java.util.Map;

import static com.api.entity.table.RoleRightTableDef.ROLE_RIGHT;
import static com.api.entity.table.RolesTableDef.ROLES;
import static com.api.entity.table.SysDeptTableDef.SYS_DEPT;
import static com.api.entity.table.UserDeptTableDef.USER_DEPT;
import static com.api.entity.table.UserRoleTableDef.USER_ROLE;
import static com.api.entity.table.UserTableDef.USER;

/**
 * @Author: yangsf
 * @CreateDate: 2024/9/24
 */

@Slf4j
@RestController
@RequestMapping("/user")
public class UserController extends BaseController{

    @Autowired
    UserMapper userMapper;
    @Autowired
    UserRoleMapper userRoleMapper;

    @Log("获取用户列表")
    @RequestMapping("/getList")
    public Result getList(@RequestBody Map<String,Object> params){
        Long loginUserId = getUserId();
        QueryWrapper qw = new QueryWrapper();
        qw.select(USER.ALL_COLUMNS, SYS_DEPT.ID.as("deptId"), SYS_DEPT.DEPT_NAME.as("deptName"),
            ROLES.ID.as("roleId"),ROLES.ROLE_NAME.as("roleName")
        )
        .leftJoin(USER_ROLE).on(USER_ROLE.USER_ID.eq(USER.ID))
        .leftJoin(ROLES).on(ROLES.ID.eq(USER_ROLE.ROLE_ID))
        .leftJoin(USER_DEPT).on(USER_DEPT.USER_ID.eq(USER.ID).and(USER_DEPT.STATUS.eq(1)))
        .leftJoin(SYS_DEPT).on(SYS_DEPT.ID.eq(USER_DEPT.DEPT_ID));
        qw.where(ROLES.ROLE_TYPE.gt(20));
        if(params.containsKey("nameKeyword") && null != params.get("nameKeyword") && !StringUtils.isEmpty(params.get("nameKeyword"))){
            String nameKeyword = params.get("nameKeyword").toString();
            qw.and(USER.LOGIN_NAME.like(nameKeyword).or(USER.USER_NAME.like(nameKeyword).or(USER.NICK_NAME.like(nameKeyword))));
        }
        if(params.containsKey("status") && null != params.get("status") && !StringUtils.isEmpty(params.get("status"))){
            Integer status = Integer.parseInt(params.get("status").toString());
            qw.and(USER.STATUS.eq(status));
        }
        if(params.containsKey("deptId") && null != params.get("deptId") && !StringUtils.isEmpty(params.get("deptId"))){
            Integer deptId = Integer.parseInt(params.get("deptId").toString());
            qw.and(USER_DEPT.DEPT_ID.eq(deptId));
        }
        if(params.containsKey("roleId") && null != params.get("roleId") && !StringUtils.isEmpty(params.get("roleId"))){
            Integer roleId = Integer.parseInt(params.get("roleId").toString());
            qw.and(USER_ROLE.ROLE_ID.eq(roleId));
        }
        //接口的数据权限: 1.全部数据  2.部门数据 3.个人数据 0.无权限
        int mLevel = getMenuRight("/user/getList");
        if(mLevel == 0){
            return Result.notRight();
        }
        //2.部门数据
        else if(mLevel == 2){
            Long deptId = getDeptId();
            if(null == deptId){
                return Result.err("未获取到部门信息, 请联系管理员");
            }
            qw.and(USER_DEPT.DEPT_ID.eq(deptId));
        }
        //3.个人数据
        else if(mLevel == 3){
            qw.and(USER.ID.eq(loginUserId).or(USER.CREATE_ID.eq(loginUserId)));
        }
        qw.orderBy(USER_DEPT.LEVEL.desc(),USER.ID.asc());
        Page page = ParamsUtils.toPage(params);
        Page<User> pages = userMapper.paginate(page,qw);
        return Result.ok(pages);
    }

    @Log("保存用户信息")
    @RequestMapping("/save")
    public Result save(@RequestBody User user){
        boolean isAdd = null == user.getId()?true:false;
        Long userId = getUserId();
        if(null == user.getDeptId()){
            return Result.err("用户部门必选");
        }
        if(isAdd){
            if(null != user.getLoginName() && !StringUtils.isEmpty(user.getLoginName())){
                User su = User.create().where(USER.LOGIN_NAME.eq(user.getLoginName())).and(USER.STATUS.ne(2)).one();
                if(null != su){
                    return Result.err("系统存在当前登录名，请更换");
                }
            }
//            if(null != user.getUserTele() && !StringUtils.isEmpty(user.getUserTele())){
//                User su = User.create().where(USER.USER_TELE.eq(user.getUserTele())).and(USER.STATUS.ne(2)).one();
//                if(null != su){
//                    return Result.err("系统存在当前手机号，请更换");
//                }
//            }
            user.setCreateId(userId);
            user.setCreateTime(new Date());
            user.setStatus(1);
            String salt = IdUtil.simpleUUID().substring(0,10);
            String pwd = SaSecureUtil.md5BySalt("123456",salt.trim());
            user.setSalt(salt);
            user.setPassword(pwd);
        }
        else{
            if(null != user.getLoginName() && !StringUtils.isEmpty(user.getLoginName())){
                User su = User.create().where(USER.LOGIN_NAME.eq(user.getLoginName())).and(USER.STATUS.ne(2)).one();
                if(null != su && su.getId().intValue() != user.getId()){
                    return Result.err("系统存在当前登录名，请更换");
                }
            }
//            if(null != user.getUserTele() && !StringUtils.isEmpty(user.getUserTele())){
//                User su = User.create().where(USER.USER_TELE.eq(user.getUserTele())).and(USER.STATUS.ne(2)).one();
//                if(null != su && su.getId().intValue() != user.getId()){
//                    return Result.err("系统存在当前手机号，请更换");
//                }
//            }
        }
        user.setUpdateId(userId);
        user.setUpdateTime(new Date());
        Long uId = user.saveOrUpdateOpt().orElseThrow(RuntimeException::new).getId();
        if(uId>0){
            if(isAdd){
                long roleId = 5L;
                UserRole.create().setUserId(uId).setRoleId(roleId).setStatus(1).setCreateId(userId).setUpdateId(userId).save();
                if(null != user.getDeptId()){
                    UserDept.create().setUserId(uId).setDeptId(user.getDeptId()).setStatus(1).setCreateId(userId).setUpdateId(userId).save();
                }
            }
            else{
                UserDept ud = UserDept.create().select(USER_DEPT.ALL_COLUMNS).where(USER_DEPT.USER_ID.eq(user)).one();
                if(null != ud){
                    UserDept.create().setId(ud.getId()).setDeptId(user.getDeptId()).setStatus(1).setUpdateId(userId).updateById();
                }
                else{
                    UserDept.create().setUserId(uId).setDeptId(user.getDeptId()).setStatus(1).setCreateId(userId).setUpdateId(userId).save();
                }
            }
            return Result.ok();
        }
        return Result.err();
    }

    @Log("用户禁用")
    @RequestMapping("/disable")
    public Result disable(Long id){
        if(null == id){
            return Result.err("未获取到用户ID");
        }
        boolean flag = User.create().setId(id).setStatus(2).updateById();
        if(flag){
            StpUtil.logout(id);
            return Result.ok();
        }
        return Result.err();
    }

    @Log("取消禁用")
    @RequestMapping("/cancelDisable")
    public Result cancelDisable(Long id){
        if(null == id){
            return Result.err("未获取到用户ID");
        }
        boolean flag = User.create().setId(id).setStatus(1).updateById();
        if(flag){
            StpUtil.logout(id);
            return Result.ok();
        }
        return Result.err();
    }

    @Log("用户注销")
    @RequestMapping("/del")
    public Result del(Long id){
        if(null == id){
            return Result.err("未获取到用户ID");
        }
        boolean flag = User.create().setId(id).setStatus(0).updateById();
        if(flag){
            StpUtil.logout(id);
            return Result.ok();
        }
        return Result.err();
    }

//    @Log("用户注销")
//    @RequestMapping("/cancelDel")
//    public Result cancelDel(Long id){
//        if(null == id){
//            return Result.err("未获取到用户ID");
//        }
//        boolean flag = User.create().setId(id).setStatus(0).updateById();
//        if(flag){
//            StpUtil.logout(id);
//            return Result.ok();
//        }
//        return Result.err();
//    }


    @Log("设置角色信息")
    @RequestMapping("/setUserRole")
    public Result setUserRole(Long userId, Long roleId){
        if(null == userId){
            return Result.err("未获取到用户ID");
        }
        if(null == roleId){
            return Result.err("未获取到角色ID");
        }
        QueryWrapper qw = new QueryWrapper();
        qw.and(USER_ROLE.USER_ID.eq(userId));
        List<UserRole> list = userRoleMapper.selectListByQuery(qw);
        int i =0;
        if(list.size()>0){
            i = userRoleMapper.deleteByQuery(qw);
        }
        else{
            i = 1;
        }
        if(i>0){
            Long operId = getUserId();
            boolean save = UserRole.create().setUserId(userId).setRoleId(roleId).setStatus(1).setCreateId(operId).setUpdateId(operId).save();
            if(save){
                return Result.ok();
            }
            return Result.err("用户角色信息已删除，请重新设置新的角色");
        }
        return Result.err();
    }


    @Log("根据用户ID，获取角色信息")
    @RequestMapping("/getUserRoleByUserId")
    public Result getUserRoleByUserId(Long  userId){
        if(null == userId){
            return Result.err("未获取到用户ID");
        }
        List<UserRole> list = UserRole.create()
                .where(USER_ROLE.USER_ID.eq(userId))
                .list();
        return Result.ok(list);
    }

    @Log("设置销售经理")
    @RequestMapping("/setDeptLevel")
    public Result setDeptLeve(){
        return Result.ok();
    }


    @Log("校验登录名")
    @RequestMapping("/checkLoginName")
    public Result checkLoginName(Long userId, String  loginName){
        if(StrUtil.isBlank(loginName)){
            return Result.err("登录名不能为空");
        }
        User user = User.create().select(USER.ALL_COLUMNS).where(USER.STATUS.eq(1)).and(USER.LOGIN_NAME.eq(loginName)).one();
        if(null != user && null != userId && userId.intValue() != user.getId().intValue()){
            return Result.err("系统存在当前登录名");
        }
        return Result.ok();
    }
}
